package com.h2cloud.Test2;

import java.io.*;
import java.lang.reflect.Constructor;

/**
 * @Package: com.h2cloud.Test2
 * @ClassName: LazyInnerClassSingleton
 * @Author: h2cloud
 * @CreateTime: 2022/8/15 10:19 下午
 * @Description:
 */
public class LazyInnerClassSingleton implements Serializable {

	private static final long serialVersionUID = -4264591697494981165L;

	// 私有的构造方法
	private LazyInnerClassSingleton(){
		// 防止反射创建多个对象
		if(LazyHolder.LAZY != null){
			throw new RuntimeException("只能实例化1个对象");
		}
	}
	// 公有的获取实例方法
	public static final LazyInnerClassSingleton getInstance(){
		return LazyHolder.LAZY;
	}
	// 静态内部类
	private static class LazyHolder{
		private static final LazyInnerClassSingleton LAZY = new LazyInnerClassSingleton();
	}
	// 防止序列化创建多个对象,这个方法是关键
	private  Object readResolve(){
		return  LazyHolder.LAZY;
	}

	public static void main(String[] args) {
		try {
			//很无聊的情况下，进行破坏
			Class<?> clazz = LazyInnerClassSingleton.class;
			//通过反射拿到私有的构造方法
			Constructor c = clazz.getDeclaredConstructor(null);
			//因为要访问私有的构造方法，这里要设为true，相当于让你有权限去操作
			c.setAccessible(true);
			//暴力初始化
			Object o1 = c.newInstance();
			//调用了两次构造方法，相当于 new 了两次
			Object o2 = c.newInstance();
			//这里输出结果为false
			System.out.println(o1 == o2);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
